import java.util.Arrays;

public class SeqList {
    public int[] array;//待使用的顺序表
    private int size;//计算顺序表存入的数据
    SeqList(){
        //无参构造方法
        this.array = new int[10];//默认大小为10
    }
    SeqList(int initcapacity) {
        //有参构造方法，设置初始化的顺序表大小
        this.array = new int[initcapacity];//自定义大小
    }

    // 新增元素,默认在数组最后新增
    public void add(int data) {
        //判断是否顺序表是否满了
        if (isFull()) {
            //满了2倍扩容
            this.array = Arrays.copyOf(this.array,2*this.array.length);
        }
        this.array[size] = data;
        this.size++;
    }
    private boolean isFull() {
        return size == array.length;
    }
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if (isFull()) {
            this.array = Arrays.copyOf(this.array,2*this.array.length);
        }
        //判断插入位置是否合法
        if (pos < 0 || pos > this.size + 1) {
            //不合法抛出自定义异常
            throw new CheckPosInAddException("插入位置不合法");
        }
        for (int i = size; i > pos - 1; i--) {
            array[i] = array[i-1];
        }
        this.array[pos-1] = data;
        this.size++;
    }
    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.size; i++) {
            if (this.array[i] == toFind) {
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.size; i++) {
            if(this.array[i] == toFind) {
                return i;
            }
        }
        throw new CheckPosInAddException("该元素不存在");
    }
    // 获取 pos 位置的元素
    public int get(int pos) {
        if(pos <0 || pos > this.size) {
            throw new CheckPosInAddException("查找位置不合法");
        }
        return this.array[pos-1];
    }
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if(pos <0 || pos > this.size) {
            throw new CheckPosInAddException("位置不合法");
        }
        this.array[pos-1] = value;
    }
    //删除第一次出现的关键字key
    public void remove(int key) {
        //第一遍遍历寻找该元素
        for (int i = 0; i < this.size; i++) {
            if (array[i] == key) {
                //找到之后，将后面的元素对前面的进行覆盖
                for (int j = i; j < this.size - 1; j++) {
                    array[j] = array[j+1];
                }
                size--;
                return;//只删除第一次出现的故删除就结束
            }
        }
        //没有这个关键字就抛出异常
        throw new CheckPosInAddException("不存在该关键字");
    }
    // 获取顺序表长度
    public int size() {
        return this.size;
    }
    // 清空顺序表
    public void clear() {
        this.size = 0;//将顺序表长度置为0也就代表顺序表清空了
    }
}
